iT邦幫忙

0

【Python學習筆記_賽事預測-MLB全壘打與勝負的相關?】

  • 分享至 

  • xImage
  •  

《Rick.C & Peter.R 共同創作》

一、全壘打跟勝負的預測,可以量化?

棒球,不只是台灣人民的國民運動,賽事勝負的關鍵更是許多人關注的焦點,不過礙於資料取得的受限,我們就以公開相對更為透明的美國最高殿堂「MLB」,作為我們研究的賽事。今天我們先從全壘打這個特徵與比賽勝負間的關係做個比較,往後將逐漸由淺入深的紀錄更多相關研究內容,思考點:
1.主隊的全壘打和勝率影響
2.客隊的全壘打和勝率影響
3.用Python視覺化資料、分析並小結
4.全壘打的逆轉勝是屬於__的?

何謂全壘打?

有參與過棒球賽事的人一定對全壘打不陌生,在棒球賽事中最讓人振奮人心的就是「全壘打」。全壘打也算是安打的一種,為打者擊出的球在界內區越過全壘打牆,並且打者可以將壘上所有跑者擠回本壘,並自己也回本壘得分的一種打擊。
因此全壘打是最快速,且最有效率的得分方式,這也是為什麼我們將其作為我們第一個研究的特徵,那廢話不多說,我們就來研究看看全壘打跟勝負間,究竟有什麼關聯性吧!!

二、用Python收集資料、爬蟲驗證相關

我們MLB的資料來源為FANGRAPHS,該網站提供相當多樣的MLB數據,不只有基礎數據,連一些進階數據如fWAR、wRC+、Woba等也皆有提供。
FANGRAPHS
數據的期間我們則抓取2015賽季至2021賽季,共7年的期間作為我們研究的賽期。

主隊全壘打較高?

運動賽式大多會分成主客場,主場隊伍因為較熟悉場地,外加球迷的支持下,被認為主隊擁有主場優勢,較容易表現出較好的成績。因此,我們來看看擁有主隊加持下的主隊,全壘打數會不會比客隊多呢?
首先,我們先導入套件

# 數據整理
import numpy as np 
import pandas as pd  
# 可視化
import matplotlib.pyplot as plt
import seaborn as sns
import plotly as py
import plotly.graph_objs as go

接著讀取資料

df = pd.read_excel(r"C:\Users\Guess365User\Desktop\MLB\fangraphs紀錄\fan_all.xlsx",index_col='date') 
df.head()

程式碼

我們爬取的資料中,只有主隊以及客隊的全壘打數,因此,我們要自行製作欄位「more_Batting_HR」,為判斷主客隊誰的全壘打數多;「W/L」為判斷主客隊誰獲勝;「more_HR_win」為判斷全壘打數多者是否獲勝

df['more_Batting_HR'] = (df['Home_Batting_HR'] > df['Away_Batting_HR'])*1
df['W/L'] = (df['主隊得分'] > df['客隊得分']) *1
df["more_HR_win"] = (df['more_Batting_HR'] == df['W/L'])*1
df.head(5)

程式碼

這裡我們用到剛剛創建的欄位「more_Batting_HR」來視覺化看看

trace0 = go.Pie(labels=df["more_Batting_HR "].value_counts().index, 
	            values=df["more_Batting_HR "].value_counts().values,
	            hole=0.5,
	            opacity=0.9,
	            marker=dict(line=dict(color='white', width=1.3))
	         ) 
layout = go.Layout(title='主客全壘打數')
data = [trace0]
fig = go.Figure(data, layout)
py.offline.plot(fig, filename=r'C:\Users\Guess365User\Desktop\IT邦寫文\圖表區\主客全壘打數.xlsx')

橘色(1)表示主隊全壘打數較多,藍色(0)表示客隊全壘打數較多。令我們訝異的是,0(客隊全壘打較多)的佔比竟然高達64%,完全顛覆我們對主隊加持的猜想。
主客全壘打

全壘打多者、比較容易得勝?

依照我們一般的邏輯,全壘打多的隊伍獲勝機率應該要較大,但這終究只是我們的猜想,我們就來將數據統計出來看看究竟是不是如我們猜想的一樣。
這裡我們用到剛剛創建的欄位「more_HR_win」來視覺化看看

trace0 = go.Pie(labels=df["more_HR_win"].value_counts().index, 
	            values=df["more_HR_win"].value_counts().values,
	            hole=0.5,
                opacity=0.9,
	            marker=dict(line=dict(color='white', width=1.3))
              ) 
layout = go.Layout(title='全壘打與勝負關係')
data = [trace0]
fig = go.Figure(data, layout)
py.offline.plot(fig, filename=r'C:\Users\Guess365User\Desktop\IT邦寫文\圖表區\全壘打與勝負關係圖.xlsx')

此處藍色(1)為全壘打數多且獲勝者,佔比為68.4%,而橘色(0)為全壘打數多但卻輸者,佔比31.6%,由此可知,全壘打數多者的確擁有較高的獲勝機率,但仍然有高達3成的機率會輸掉比賽
全壘打與勝負關係

三、回測這麼說:客隊全壘打多且獲勝的機率為57.6%

最後,我們來看看這68.4%的全壘打多且獲勝的隊伍中,究竟是主隊較多,還是客隊較多呢?
我們將df中全壘打數多且獲勝的隊伍取出,並存放到「df_hr_win」中

df_hr_win = df[df['more_Batting_HR'] == df['W/L']] 
df_hr_win.head() 

程式碼

接著將「W/L」這欄位的數值視覺化看看

trace0 = go.Pie(labels=df_hr_win["W/L"].value_counts().index, 
	            values=df_hr_win["W/L"].value_counts().values,
	            hole=0.5,
                opacity=0.9,
	            marker=dict(line=dict(color='white', width=1.3))
              ) 
layout = go.Layout(title='全壘打勝負與主客關係')
data = [trace0]
fig = go.Figure(data, layout)
py.offline.plot(fig, filename=r'C:\Users\Guess365User\Desktop\IT邦寫文\圖表區\全壘打勝負與主客關係.xlsx')

藍色(0)表示全壘打數多且獲勝的隊伍為客隊,其佔比達57.6%,而橘色(1)表示全壘打數多且獲勝的隊伍為主隊,佔比為42.4%,由此可知,客隊打出較多全壘打數的獲勝機率較高
全壘打勝負與主客關係

全壘打的逆轉勝是屬於__的?

根據今天的研究,全壘打多者的確獲勝的機率較大,但主隊卻沒因為主隊加持的關係而擊出較多的全壘打,反倒是客隊較容易擊出全壘打,這部分就顛覆我們對主隊優勢的觀點,因此別太相信主隊優勢這一說詞,其對主隊的成績不一定有好的幫助。
  小編這邊反倒認為,全壘打是屬於觀眾的,因為不管是誰敲出去,轟聲都是一樣的熱烈

【參考平台與資訊 & Python語言書籍】

  • [Guess官網平台-分析專欄] https://reurl.cc/yMOVE6
  • [偏不讓你爬:最強Python爬蟲 vs 反爬蟲大戰實錄]
  • [Python 資料科學實戰教本:爬蟲、清理、資料庫、視覺化、探索式分析、機器學習建模,數據工程一次搞定!]

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言